'use strict';

// 二.基于以下代码完成下面四个练习
var fp = require('lodash/fp');

var cars = [{ name: 'Ferrari FF', horsepower: 660,
    dollar_value: 7000000, in_stock: true }, { name: 'spyker c12 zagato', horsepower: 650,
    dollar_value: 648000, in_stock: false }, { name: 'Jaguar XKR-S', horsepower: 550,
    dollar_value: 132000, in_stock: false }, { name: 'Audi R8', horsepower: 525,
    dollar_value: 114200, in_stock: false }, { name: 'Aston Martin One-77', horsepower: 750,
    dollar_value: 1850000, in_stock: true }, { name: 'Pagani Huayra', horsepower: 700,
    dollar_value: 1300000, in_stock: false }];

// 练习1.使用函数组合fp.flowRight()重新实现下面这个函数

let isLastInStock = function(cars) {
    //获取最后一条数据
    let last_car = fp.last(cars);
    //获取最后一条数组的 in_stock属性
    return fp.prop('in_stock', last_car);
};
console.log(`二.练习一改造前：${isLastInStock(cars)}`);

//改造后

let findInStock = function (lastCar) {
    return fp.prop('in_stock', lastCar);
}
let islastInStock = fp.flowRight(findInStock, fp.last)
console.log(`二.练习一改造后：${islastInStock(cars)}`);

//练习2.使用fp.flowRight(),fp.prop()和fp.first()获取第一个car的name

let carName = function(car){
    return fp.prop('name', car)
}
let isFirstCar = fp.flowRight(carName, fp.first)
console.log(`二.练习二：${isFirstCar(cars)}`)

//练习3.使用帮助函数_average重构averageDollarValue，使用函数组合的方式实现

let _average = function (xs) {
    console.log(xs)
    return fp.reduce(fp.add, 0, xs) / xs.length
} // <- 无需改动
let averageDollarValue = function (cars) {
    let dollar_values = fp.map(
        function(car){
            return car.dollar_value
        },cars)
    return _average(dollar_values)
}
console.log(`二.练习三重构前：${averageDollarValue(cars)}`)

//重构
// let getDollarValue = function(car){
//     console.log(car.dollar_value)
//     return car.dollar_value;
// }
let averageDollarValueAfter = fp.flowRight(_average, fp.map(value => value.dollar_value))
console.log(`二.练习三重构后：${averageDollarValueAfter(cars)}`)


//练习4.使用flowRight写一个sanitzeNames()函数，返回一个下划线连接的小写字符串，把数组中的name转换成这种形式：例如：
// sanitizeNames(["Hello World"]) => ["hello_world"]

let _underscore = fp.replace(/\W+/g, '_')//<-- 无需改动，并在 sanitizeNames中使用它

// 答案：
// let sanitzeNames = fp.flowRight(fp.map(_underscore), fp.map(fp.toLower), fp.map(value => value.name)) ;
let sanitzeNames = fp.map(fp.flowRight(_underscore, fp.toLower, fp.prop('name'))) ;
//使用``这种不能正确打印数组，这是字符串模板，只能打印字符串，正确方法如下
console.log('二.练习四：', sanitzeNames(cars))